package pe.com.bbva.ge.persistencia.orm.hibernate;

import java.sql.SQLException;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import pe.com.bbva.ge.domain.configuracion.Lista;
import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.persistencia.orm.BaseORM;
import pe.com.bbva.ge.persistencia.orm.hibernate.utileria.Busqueda;

public abstract class BaseORMHibernate extends HibernateDaoSupport implements
		BaseORM {
	
	protected final static Logger logger = LogManager.getLogger(BaseORMHibernate.class);
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 3829050759977565836L;
	
	protected BaseORMHibernate(SessionFactory sessionFactory) {
		setSessionFactory(sessionFactory);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	protected <Entidad> List<Entidad> buscar(final Busqueda filtro) {
		return (List<Entidad>) this.getHibernateTemplate().execute(
				new HibernateCallback() {
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						Criteria busqueda = filtro
								.getExecutableCriteria(session);
						busqueda.setFirstResult(((Busqueda) filtro)
								.getFirstResult());
						if (filtro.getMaxResults() > 0) {
							busqueda.setMaxResults(((Busqueda) filtro)
									.getMaxResults());
						}
						return (List<Entidad>) busqueda.list();
					}
				});
	}
	
	protected <Entidad> List<Entidad> buscarHql(String sql, Object... object){
		return (List<Entidad>) getHibernateTemplate().find(sql,object);
	}
	
	protected void agregarFiltroEstadoActivo(final Busqueda filtro)
	{
		filtro.createAlias("estado", "estadoEntidad");
		filtro.add(Restrictions.eq("estadoEntidad.codigo", Valor.CODIGO.REGISTRO_ESTADO_ACTIVO));
		
		filtro.createAlias("estadoEntidad.lista", "listaEntidad");
		filtro.add(Restrictions.eq("listaEntidad.codigo", Lista.CODIGO.ESTADO_ENTIDAD));
	}

}
